package com.io.bio;

import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class BioBasic {

    public static void main(String[] args) throws Exception {
        //创建线程池
        ExecutorService executorService = Executors.newCachedThreadPool();
        //创建服务器
        ServerSocket serverSocket = new ServerSocket(8888);
        System.out.println("服务器创建成功");
        while (true){

            //阻塞式监听，等待客户端的连接，每次连接完成之后，都会创建一个子线程来处理客户端的请求
            //主线程会再次等待在这里进行客户端的再次连接
            System.out.println("当前线程为"+Thread.currentThread().getName()+"，等待连接客户端");
            final Socket accept = serverSocket.accept();
            System.out.println("当前线程为"+Thread.currentThread().getName()+"，连接到客户端");

            //创建一个线程与客户端通信
            //线程池对象只要执行execute方法，然后在execute传入一个实现了run方法的Runnable接口
            //线程池就会拿出一个线程来执行run方法
            executorService.execute(new Runnable() {
                public void run() {
                   handler(accept);
                }
            });
        }
    }

    private static void handler(Socket accept) {
        byte[] bytes = new byte[1024];
        try {
            InputStream inputStream = accept.getInputStream();
            while (true){
                //如果没有发送数据那么线程就会阻塞在这里
                System.out.println("当前线程为"+Thread.currentThread().getName()+"，等待数据发送");
                int len = inputStream.read(bytes);
                if (len!=-1){
                    System.out.println("客户端发送的数据为:"+new String(bytes,0,len));
                }
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            try {//这个关闭的时候inputStream也会关闭（猜的）
                accept.close();
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    }

}
